Background Mode & nohup & nice renice

커맨드라인에서 일반적으로 프로세스(쉘 스크립트)를 실행할 때, 해당 쉘은 작업에 묶여 다른 작업을 하지 못하게 된다.
이 때 백그라운드 모드로 프로세스를 실행할 수 있다.
(백그라운드 모드의 프로세스는 터미널 세션을 잠그지 않음)
./commands.sh &
단순히 명령 다음에 앰퍼샌드(&)를 사용해서 백그라운드 모드에서 쉘 스크립트를 수행할 수 있다.
백그라운드 프로세스 실행시
[작업번호] PID 를 리턴한다.

작업이 완료되면, 실행한 쉘로
[작업 번호] Done 을 린턴한다.

(백그라운드 프로세스가 실행되는 동안 STDOUT과 STDERR 메시지는 계속해서 터미널 모니터를 사용함)
여러개의 작업의 STDOUT과 STDERR가 섞이지 않도록 백그라운드 프로세스의 출력을 리다이렉트 하는 것이 좋다.
쉘을 통해서 실행한 백그라운드 프로세스들 또한 터미널 세션과 연결되어 있기 때문에 만일 터미널 세션이 작업을 종료하는 경우
백그라운드 프로세스도 같이 종료된다.
(백그라운드 프로세스가 있는 상태에서 종료를 시도하는 경우 일부 터미널 애뮬레이터만이 세션을 종료하기 전에 경고한다.)
nohup ./commands.sh &
nohup 명령을 통해 수행되는 작업은 전송되는 모든 SIGHUP 신호를 차단하는 다른 명령을 실행한다.
(쉘 세션을 닫았을 때, 전소오디는 SIGHUP 신호를 무시)

nohup 명령은 프로세스와 터미널 사이의 연결을 끊기 때문에 프로세스는 STDOUT 및 STDERR 출력 링크를 잃는다.
(default로 nohup.out 파일로 STDOUT, STDERR를 리다이렉트함)
작업 제어
Ctrl+Z 로 인해 중단된 작업 프로세스는 SIGCONT 신호를 전송해 작업을 재개할 수 있다.
jobs #
jobs -l # PID
jobs 출력에는 +, -가 최대 한개씩 존재할 수 있다.
+: 현재 기본 작업
-: 현재 기본 작업 종료 후, 기본 작업이 될 작업
중단된 작업을 다시 재개할 때, 포그라운드 프로세스와 백그라운드 프로세스 둘 중 한가지 형태로 재개할 수 있다.
(포그라운드 프로세스로 재개할 경우, 작업하고 있는 터미널의 제어권을 넘겨줘야 함)
bg # + jobs
bg < >
fg < > # jobs
nice
멀티태스킹 운영체제(리눅스 포함)에서 커널은 시스템에서 실행되는 각 프로세스에 대해 CPU 시간을 할당해야 하는 책임을 가진다.

리눅스 시스템에서 스케줄링 우선순위는 -20(가장 높은 우선순위)에서 +19(가장 낮은 우선순위) 사이의 정수값을 가진다.
기본적으로 bash 쉘에서 수행되는 모든 프로세스를 스케줄링 우선순위 0으로 실행한다.
nice -n 10 ./commands.sh &
nice -10 ./commands.sh &
-n 옵션을 이용해서 스케줄링 우선순위를 지정

일반 사용자 계정을 이용해서 스케줄링 우선순위를 음수로 설정할 수 없다.
(우선순위 음수로 설정하는 작업이 실패하여도 작업은 수행됨)
ps -p $$ -o pid,ni # ni
renice
이미 실행중인 프로세스의 우선순위를 변경
renice -n 10 -p <PID>
renice는 PID를 통해 해당 프로세스의 우선순위를 변경할 수 있다.
renice 제약사항
- 소유권을 가지고 있는 프로세스에 대해서만 renice 명령 수행가능(sudo 제외)
- 낮은 우선순위(+)로만 프로세스를 renice 할 수 있다.
- 루트 사용자는 어떤 프로세스에 어떤 우선순위로든 renice 명령 수행 가능